2012/04/20

Recent entries from same category

  1. Ruby の Array#<< は Array#push よりも速いか
  2. Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか
  3. Re: Ruby 製バッチ処理を省メモリ化した
  4. Crystal と CRuby でHTTPサーバのベンチマーク
  5. pure mruby な JSON パーサ書いた。

FizzBuzzに並んで有名な教育向けな題材、Acme::Oppaiです。
#include <mruby.h>
#include <mruby/proc.h>
#include <compile.h>

static mrb_value
oppailib_oppaifunc(mrb_state *mrb, mrb_value self) {
  static int i = 0;
  puts(i++ % 2 == 0 ?
"    _    おっ \n"
"  ( ゜∀゜)    \n"
"  (  ⊂彡     \n"
"   |   |     \n"
"   し ⌒J     \n" :
"    _  ∩ おっ \n"
"  ( ゜∀゜)彡 ぱい\n"
"  (    |    \n"
"   |   |    \n"
"   し ⌒J     \n");
  return self;
}

int
main() {
  int n;
  mrb_state* mrb;
  struct mrb_parser_state* st;
  struct RClass *oppailib;
  char* code =
"require 'Oppai'                       \n"
"Oppai.oppai().oppai().oppai().oppai() \n";

  mrb = mrb_open();

  oppailib = mrb_define_module(mrb, "Oppai");
  mrb_define_class_method(mrb, oppailib, "oppai", oppailib_oppaifunc, ARGS_REQ(1));

  st = mrb_parse_string(mrb, code);
  n = mrb_generate_code(mrb, st->tree);
  mrb_pool_close(st->pool);
  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
}

/* vim:set et ts=2 sts=2 sw=2 tw=0: */
ruby のAPIと若干形が異なるので、既存コードとか移植する人はいろいろあるかも。
Posted at by